package admin

import (
	"geekai/api/dto/request"
	"geekai/api/handler"
	"geekai/core"
	"geekai/core/types"
	"geekai/model"
	"geekai/utils"
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
)

type ConfigHandler struct {
	handler.BaseHandler
}

func NewConfigHandler(app *core.AppServer, db *gorm.DB) *ConfigHandler {
	return &ConfigHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}}
}

// Update godoc
// @Summary      修改系统配置
// @Description  修改系统配置
// @Tags         后台管理-系统配置
// @Accept       json
// @Produce      json
// @Param        req   body     request.ConfigUpdateReq  true  "系统配置信息"
// @Success      200  {object}  types.BizVo{date=model.Config}
// @Router       /api/admin/config/update [post]
// @Security AdminApiKeyAuth
func (h *ConfigHandler) Update(c *gin.Context) {
	var data request.ConfigUpdateReq
	if err := c.ShouldBindJSON(&data); err != nil {
		utils.ERROR(c, types.InvalidArgs)
		return
	}
	value := utils.JsonEncode(&data.Config)
	config := model.Config{Key: data.Key, Config: value}
	// 查询 model.Config{Key: data.Key} 这个条件的数据是否存在，如果不存在就创建，如果存在就查询出来
	res := h.DB.FirstOrCreate(&config, model.Config{Key: data.Key})
	if res.Error != nil {
		utils.ERROR(c, "修改配置信息失败："+res.Error.Error())
		return
	}

	if config.Id > 0 {
		config.Config = value
		// 修改配置
		res := h.DB.Updates(&config)
		if res.Error != nil {
			utils.ERROR(c, "修改配置信息失败："+res.Error.Error())
			return
		}
		// 查询配置信息
		var cfg model.Config
		h.DB.Where("marker", data.Key).First(&cfg)
		var err error
		if data.Key == "system" {
			// 修改AppServer中存储的配置信息
			err = utils.JsonDecode(cfg.Config, &h.App.SysConfig)
		}
		if err != nil {
			utils.ERROR(c, "修改系统缓存中的配置信息失败："+err.Error())
			return
		}
		log.Infof("修改 AppServer's 配置信息成功: %v", config.Config)
	}
	utils.SUCCESS(c, config)
}

// Get godoc
// @Summary      获取系统配置
// @Description  获取系统配置
// @Tags         后台管理-系统配置
// @Accept       json
// @Produce      json
// @Param        key   query     string  true  "要查询的系统配置信息key"
// @Success      200  {object}  types.BizVo{date=map[string]interface{}}
// @Router       /api/admin/config/get [get]
// @Security AdminApiKeyAuth
func (h *ConfigHandler) Get(c *gin.Context) {
	key := c.Query("key")
	var config model.Config
	res := h.DB.Where("marker", key).First(&config)
	if res.Error != nil {
		utils.ERROR(c, "获取系统配置出错："+res.Error.Error())
		return
	}
	var value map[string]interface{}
	err := utils.JsonDecode(config.Config, &value)
	if err != nil {
		utils.ERROR(c, "获取系统配置，JSON解码出错："+res.Error.Error())
		return
	}
	utils.SUCCESS(c, value)
}
